<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
<meta name="viewport"
      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">

    <meta name="author" content="Ian Tang">


    <meta name="subtitle" content="岁月不居时节如流">


    <meta name="description" content="好记性不如烂笔头">



<title>python包的几种管理工具 | 随笔</title>



    <link rel="icon" href="/image/The_Lion_King_32_32.png">




    <!-- stylesheets list from _config.yml -->
    
    <link rel="stylesheet" href="/css/style.css">
    



    <!-- scripts list from _config.yml -->
    
    <script src="/js/script.js"></script>
    
    <script src="/js/tocbot.min.js"></script>
    



    
    
        
    


<meta name="generator" content="Hexo 6.3.0"></head>

<body>
    <script>
        // this function is used to check current theme before page loaded.
        (() => {
            const currentTheme = window.localStorage && window.localStorage.getItem('theme') || '';
            const isDark = currentTheme === 'dark';
            const pagebody = document.getElementsByTagName('body')[0]
            if (isDark) {
                pagebody.classList.add('dark-theme');
                // mobile
                document.getElementById("mobile-toggle-theme").innerText = "· Dark"
            } else {
                pagebody.classList.remove('dark-theme');
                // mobile
                document.getElementById("mobile-toggle-theme").innerText = "· Light"
            }
        })();
    </script>

    <div class="wrapper">
        <header>
    <nav class="navbar">
        <div class="container">
            <div class="navbar-header header-logo"><a href="/">Tangkaifei&#39;s Blog</a></div>
            <div class="menu navbar-right">
                
                    <a class="menu-item" href="/archives">Posts</a>
                
                    <a class="menu-item" href="/category">Categories</a>
                
                    <a class="menu-item" href="/tag">Tags</a>
                
                    <a class="menu-item" href="/about">About</a>
                
                <input id="switch_default" type="checkbox" class="switch_default">
                <label for="switch_default" class="toggleBtn"></label>
            </div>
        </div>
    </nav>

    
    <nav class="navbar-mobile" id="nav-mobile">
        <div class="container">
            <div class="navbar-header">
                <div>
                    <a href="/">Tangkaifei&#39;s Blog</a><a id="mobile-toggle-theme">·&nbsp;Light</a>
                </div>
                <div class="menu-toggle" onclick="mobileBtn()">&#9776; Menu</div>
            </div>
            <div class="menu" id="mobile-menu">
                
                    <a class="menu-item" href="/archives">Posts</a>
                
                    <a class="menu-item" href="/category">Categories</a>
                
                    <a class="menu-item" href="/tag">Tags</a>
                
                    <a class="menu-item" href="/about">About</a>
                
            </div>
        </div>
    </nav>

</header>
<script>
    var mobileBtn = function f() {
        var toggleMenu = document.getElementsByClassName("menu-toggle")[0];
        var mobileMenu = document.getElementById("mobile-menu");
        if(toggleMenu.classList.contains("active")){
           toggleMenu.classList.remove("active")
            mobileMenu.classList.remove("active")
        }else{
            toggleMenu.classList.add("active")
            mobileMenu.classList.add("active")
        }
    }
</script>
            <div class="main">
                <div class="container">
    
    
        <div class="post-toc">
    <div class="tocbot-list">
    </div>
    <div class="tocbot-list-menu">
        <a class="tocbot-toc-expand" onclick="expand_toc()">Expand all</a>
        <a onclick="go_top()">Back to top</a>
        <a onclick="go_bottom()">Go to bottom</a>
    </div>
</div>

<script>
    var tocbot_timer;
    var DEPTH_MAX = 6; // 为 6 时展开所有
    var tocbot_default_config = {
        tocSelector: '.tocbot-list',
        contentSelector: '.post-content',
        headingSelector: 'h1, h2, h3, h4, h5',
        orderedList: false,
        scrollSmooth: true,
        onClick: extend_click,
    };

    function extend_click() {
        clearTimeout(tocbot_timer);
        tocbot_timer = setTimeout(function() {
            tocbot.refresh(obj_merge(tocbot_default_config, {
                hasInnerContainers: true
            }));
        }, 420); // 这个值是由 tocbot 源码里定义的 scrollSmoothDuration 得来的
    }

    document.ready(function() {
        tocbot.init(obj_merge(tocbot_default_config, {
            collapseDepth: 1
        }));
    });

    function expand_toc() {
        var b = document.querySelector('.tocbot-toc-expand');
        var expanded = b.getAttribute('data-expanded');
        expanded ? b.removeAttribute('data-expanded') : b.setAttribute('data-expanded', true);
        tocbot.refresh(obj_merge(tocbot_default_config, {
            collapseDepth: expanded ? 1 : DEPTH_MAX
        }));
        b.innerText = expanded ? 'Expand all' : 'Collapse all';
    }

    function go_top() {
        window.scrollTo(0, 0);
    }

    function go_bottom() {
        window.scrollTo(0, document.body.scrollHeight);
    }

    function obj_merge(target, source) {
        for (var item in source) {
            if (source.hasOwnProperty(item)) {
                target[item] = source[item];
            }
        }
        return target;
    }
</script>
    

    
    <article class="post-wrap">
        <header class="post-header">
            <h1 class="post-title">python包的几种管理工具</h1>
            
                <div class="post-meta">
                    
                        Author: <a itemprop="author" rel="author" href="/">Ian Tang</a>
                    

                    
                        <span class="post-time">
                        Date: <a href="#">十一月 27, 2022&nbsp;&nbsp;12:45:00</a>
                        </span>
                    
                    
                        <span class="post-category">
                    Category:
                            
                                <a href="/categories/%E6%8A%80%E6%9C%AF%EF%BC%9A%E7%9F%A5%E8%AF%86%E6%8A%80%E8%83%BD/">技术：知识技能</a>
                            
                        </span>
                    
                </div>
            
        </header>

        <div class="post-content">
            <p>在安装Python包的过程中，经常涉及到distutils、setuptools、distribute、setup.py、easy_install、easy_install和pip等等。</p>
<h3 id="distutils"><a href="#distutils" class="headerlink" title="distutils"></a><strong>distutils</strong></h3><p>distutils 是 python 标准库的一部分，这个库的目的是为开发者提供一种方便的打包方式， 同时为使用者提供方便的安装方式。</p>
<p>我们经常使用的setup.py就是基于distutils实现的，然后通过setup.py就可以进行打包或者安装了。</p>
<p>看一个简单的例子，找一个目录创建三个文件foo.py、bar.py和setup.py，其中setup.py的内容如下：</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> distutils.core <span class="keyword">import</span> setupsetup( name=<span class="string">&#x27;fooBar&#x27;</span>, version=<span class="string">&#x27;1.0&#x27;</span>, author=<span class="string">&#x27;Will&#x27;</span>, author_email=<span class="string">&#x27;wilber@sh.com&#x27;</span>, url=<span class="string">&#x27;http://www.cnblogs.com/wilber2013/&#x27;</span>, py_modules=[<span class="string">&#x27;foo&#x27;</span>, <span class="string">&#x27;bar&#x27;</span>],)</span><br></pre></td></tr></table></figure>

<p>然后，在该目录中运行 python setup.py sdist ，会得到以下输出，同时生成了一个”fooBar-1.0.zip”包。</p>
<p>使用者就可以解压缩这个包然后执行 python setup.py install进行安装，然后就可以使用foo、bar这两个模块了</p>
<h3 id="setuptools-和-distribute"><a href="#setuptools-和-distribute" class="headerlink" title="setuptools 和 distribute"></a><strong>setuptools 和 distribute</strong></h3><p><strong>setuptools</strong>是对 distutils 的增强，尤其是引入了包依赖管理。我们可以通过ez_setup.py来安装setuptools。</p>
<p>至于<strong>distribute</strong>，它是setuptools的一个分支版本。分支的原因是有一部分开发者认为 setuptools 开发太慢。但现在，distribute 又合并回了 setuptools 中，所以可以认为它们是同一个东西。</p>
<p>前面看到setup.py可以创建一个压缩包，而setuptools使用了一种新的文件格式（**.egg**），可以为Python包创建 egg文件。setuptools 可以识别.egg文件，并解析、安装它。</p>
<p>easy_install</p>
<p>当安装好setuptools&#x2F;distribute之后，我们就可以直接使用easy_install这个工具了：</p>
<p>1.从PyPI上安装一个包：当使用 easy_install package 命令后，easy_install 可以自动从 PyPI 上下载相关的包，并完成安装，升级</p>
<p>2.下载一个包安装：通过 easy_install package.tgz 命令可以安装一个已经下载的包</p>
<p>3.安装egg文件：通过 easy_install package.egg 可以安装一个egg格式的文件</p>
<p>通过 easy_install –help 命令可以获取该命令相关的帮助提示</p>
<p>根据上面的分析，可以看到setuptools&#x2F;distribute和easy_install之间的关系：</p>
<p>*setuptools&#x2F;distribute 都扩展了 distutils，提供了更多的功能</p>
<p>*easy_install是基于setuptools&#x2F;distribute的一个工具，方便了包的安装和省级</p>
<h3 id="pip"><a href="#pip" class="headerlink" title="pip"></a><strong>pip</strong></h3><p>pip是目前最流行的Python包管理工具，它被当作easy_install的替代品，但是仍有大量的功能建立在setuptools之上。</p>
<p>easy_install 有很多不足：安装事务是非原子操作，只支持 svn，没有提供卸载命令， 安装一系列包时需要写脚本。pip 解决了以上问题，已经成为新的事实标准。</p>
<p>pip的使用非常简单，并支持从任意能够通过 VCS 或浏览器访问到的地址安装 Python 包：</p>
<p>*<strong>安装:</strong> pip install SomePackage</p>
<p>*<strong>卸载:</strong> pip uninstall SomePackage</p>
<p>使用pip</p>
<p>在大家使用Python中，推荐使用pip进行Python包管理，pip的安装和使用都比较方便。</p>
<p><strong>pip安装</strong></p>
<p>pip的安装有两种常用的方式：</p>
<p>1.下载get-pip.py文件，然后执行 python get-pip.py 进行安装（如果没有安装setuptools，那么get-pip.py会帮忙安装）</p>
<p>2.现在pip源码包，然后通过setup.py进行安装</p>
<p>pip常用命令</p>
<p>对于pip，最常用的肯定还是 pip –help ，通过帮助文档，就可以大概知道如何使用命令和参数。</p>

        </div>

        
            <section class="post-copyright">
                
                    <p class="copyright-item">
                        <span>Author:</span>
                        <span>Ian Tang</span>
                    </p>
                
                
                    <p class="copyright-item">
                        <span>Permalink:</span>
                        <span><a href="https://tkhfree.github.io/2022/11/27/python%E5%8C%85%E7%9A%84%E5%87%A0%E7%A7%8D%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7-2022-11-27/">https://tkhfree.github.io/2022/11/27/python%E5%8C%85%E7%9A%84%E5%87%A0%E7%A7%8D%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7-2022-11-27/</a></span>
                    </p>
                
                
                    <p class="copyright-item">
                        <span>License:</span>
                        <span>Copyright (c) 2019 <a target="_blank" rel="noopener" href="http://creativecommons.org/licenses/by-nc/4.0/">CC-BY-NC-4.0</a> LICENSE</span>
                    </p>
                
                
                     <p class="copyright-item">
                         <span>Slogan:</span>
                         <span>Do you believe in <strong>DESTINY</strong>?</span>
                     </p>
                

            </section>
        
        <section class="post-tags">
            <div>
                <span>Tag(s):</span>
                <span class="tag">
                    
                    
                        <a href="/tags/python/"># python</a>
                    
                        
                </span>
            </div>
            <div>
                <a href="javascript:window.history.back();">back</a>
                <span>· </span>
                <a href="/">home</a>
            </div>
        </section>
        <section class="post-nav">
            
                <a class="prev" rel="prev" href="/2022/11/27/python%E6%A6%82%E8%BF%B0%E5%92%8C%E6%80%BB%E7%BB%93-2022-11-27/">python概述和总结</a>
            
            
            <a class="next" rel="next" href="/2022/11/27/gRPC%E5%92%8Cprotobuf%E4%BB%8B%E7%BB%8D-2022-11-27/">gRPC和protobuf介绍</a>
            
        </section>


    </article>
</div>

            </div>
            <footer id="footer" class="footer">
    <div class="copyright">
        <span>© Ian Tang | Powered by <a href="https://hexo.io" target="_blank">Hexo</a> & <a href="https://github.com/Siricee/hexo-theme-Chic" target="_blank">Chic</a></span>
    </div>
</footer>

    </div>
</body>

</html>